/*
 * 版权所有 ( c ) 联想集团有限公司 2005-2009 保留所有权利。
 * 项目：	Lenovo Push Service
 * 文件名：	CaesarCipher.java
 * 版本:    1.0
 * 描述：	
 * 作者：	刘兵召
 * 日期：	Jul 7, 2010 
 * 修改历史：
 * 【时间】		【修改者】	【修改内容】
 */
package com.feng.security.caesar;
/**
 * 注：本示例中只考虑了大小写英文字母的替换，实际实现中应将数字、+、/等BASE64字符都考虑进去。
 *
 */
public class CaesarCipherUtil {
	private static final char[] UC_ENCRYPT_CHARS = { 'M', 'D', 'X', 'U', 'P',
			'I', 'B', 'E', 'J', 'C', 'T', 'N', 'K', 'O', 'G', 'W', 'R', 'S',
			'F', 'Y', 'V', 'L', 'Z', 'Q', 'A', 'H' };
	private static final char[] LC_ENCRYPT_CHARS = { 'm', 'd', 'x', 'u', 'p',
			'i', 'b', 'e', 'j', 'c', 't', 'n', 'k', 'o', 'g', 'w', 'r', 's',
			'f', 'y', 'v', 'l', 'z', 'q', 'a', 'h' };
	private static char[] UC_DECRYPT_CHARS = new char[26];
	private static char[] LC_DECRYPT_CHARS = new char[26];
	static {
		for (int i = 0; i < 26; i++) {
			char b = UC_ENCRYPT_CHARS[i];
			UC_DECRYPT_CHARS[b - 'A'] = (char) ('A' + i);
			b = LC_ENCRYPT_CHARS[i];
			LC_DECRYPT_CHARS[b - 'a'] = (char) ('a' + i);
		}
	}

	public static char encrypt(char b) {
		if (b >= 'A' && b <= 'Z') {
			return UC_ENCRYPT_CHARS[b - 'A'];
		} else if (b >= 'a' && b <= 'z') {
			return LC_ENCRYPT_CHARS[b - 'a'];
		} else {
			return b;
		}
	}

	public static char decrypt(char b) {
		if (b >= 'A' && b <= 'Z') {
			return UC_DECRYPT_CHARS[b - 'A'];
		} else if (b >= 'a' && b <= 'z') {
			return LC_DECRYPT_CHARS[b - 'a'];
		} else {
			return b;
		}
	}

	public static String encrypt(String input) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < input.length(); i++) {
			sb.append(encrypt(input.charAt(i)));
		}
		return sb.toString();
	}

	public static String decrypt(String input) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < input.length(); i++) {
			sb.append(decrypt(input.charAt(i)));
		}
		return sb.toString();
	}
	
	
	public static void main(String args[]){
		String str = "123098495a刘";
		System.out.println("加密前："+str);
		String encode = CaesarCipherUtil.encrypt(str);
		System.out.println("加密后："+encode);
		String decode = CaesarCipherUtil.decrypt(encode);
		System.out.println("解密后："+decode);
	}
}
